// crypto-js加密
import CryptoJS from 'crypto-js'

// 十六位十六进制数作为密钥
const SECRET_KEY = CryptoJS.enc.Utf8.parse('123wsygkldxeb456')
// 十六位十六进制数作为密钥偏移量
const SECRET_IV = CryptoJS.enc.Utf8.parse('abcksaldnxzandkf')

/**
 * crypto-js加密
 * @description 描述信息
 * @remarks 备注
 * @param {string} data [加密内容]
 * @param {string} key [加密密钥-十六位十六进制数作为密钥]
 * @param {string} iv [密钥偏移量-默认为aseKey]
 * @returns {string}	[加密后的内容]
 */
export function cryptoEncryption(
  data: any,
  key: string = SECRET_KEY,
  iv: string = SECRET_IV,
): string {
  if (typeof data === 'object') {
    try {
      data = JSON.stringify(data)
    }
    catch (error) {}
  }
  const dataHex = CryptoJS.enc.Utf8.parse(data)
  const encrypted = CryptoJS.AES.encrypt(dataHex, key, {
    iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7,
  })
  return encrypted.ciphertext.toString()

  // aseKey为密钥（必须为：8/16/32位），message为要加密的密文
  // 这里要加.Base64。网上大多数例子都没有，否则和后端加密不同，解析不出来
  // const o = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(key));
  // key = CryptoJS.enc.Base64.parse(o);
  // const c = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(iv || key));
  // iv = CryptoJS.enc.Base64.parse(c);
  // const encrypt = CryptoJS.AES.encrypt(data, key, {
  //   iv,
  //   mode: CryptoJS.mode.CBC,
  //   padding: CryptoJS.pad.Pkcs7
  // });
  // return encrypt.toString().toLowerCase();
}
/**
 * crypto-js解密
 * @description 描述信息
 * @remarks 备注
 * @param {string} crypted [加密内容]
 * @param {string} key [加密密钥-十六位十六进制数作为密钥]
 * @param {string} iv [密钥偏移量-默认为aseKey]
 * @returns {string} [解密后的内容]
 */
export function cryptoDecrypt(
  crypted: string,
  key: string = SECRET_KEY,
  iv: string = SECRET_IV,
): string {
  const encryptedHexStr = CryptoJS.enc.Hex.parse(crypted)
  const str = CryptoJS.enc.Base64.stringify(encryptedHexStr)
  const decrypt = CryptoJS.AES.decrypt(str, key, {
    iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7,
  })
  const decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
  return decryptedStr.toString()
}

// const blank = 'blankfasdfasd';

// const cryted = cryptoEncryption(blank);
// const decryed = cryptoDecrypt(cryted);
